iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0

Golang

goroutine
我自己理解goroutine 就很類似其他語言的thread[備註1],只是特別的地方是go 用 goroutine很簡易的方式去讓開發者 實現多執行緒[備註2]程式

來點範例

package main

import (
        "fmt"
        "time"
)

func say(s string) {
        for i := 0; i < 5; i++ {
                time.Sleep(100 * time.Millisecond)
                fmt.Println(s)
        }
}

func main() {
        go say("a")
	//say("a")
        say("b")
}

這對於比較常寫PHP的我,真的實在太驚人了!!!!!

Channel

Goroutine的溝通主要可以透過channel、全域變數進行操作。

package main

import (
        "fmt"
        "time"
)

func say(s string, val  chan int) {
        for i := 0; i < 2; i++ {
                time.Sleep(100 * time.Millisecond)
                 fmt.Printf("say %s \n" ,s)

        }
val <- 1 //注入資料1
}
func say2(s string, val  chan int) {
        for i := 0; i < 2; i++ {
                time.Sleep(100 * time.Millisecond)
                fmt.Printf("say2 %s \n" ,s)

        }
val <- 2 //注入資料1
}

func main() {
val := make(chan int)
        go say("a", val )
        go say2("a", val )
	x := <-val  // receive from c

	fmt.Println(x)
}

直接來改看看,雖然這支是沒啥意義的程式,但可以看得出來是共享x,然後多跑幾次就會發現誰搶贏誰搶輸了

備註:

  1. 執行緒(英語:thread)是作業系統能夠進行運算排程的最小單位。 大部分情況下,它被包含在行程之中,是行程中的實際運作單位。 一條執行緒指的是行程中一個單一順序的控制流,一個行程中可以並行多個執行緒,每條執行緒並列執行不同的任務。 ... 執行緒是獨立排程和分派的基本單位。 來源wiki維基百科。
  2. 一個Process可以向作業系統取得多個執行緒(threads),多個執行緒可以達到類似平行處理的效果。

參考資料
https://zh.wikipedia.org/zh-tw/%E7%BA%BF%E7%A8%8B


上一篇
function
下一篇
switch-case 與select
系列文
go go let's go - golang 從0開始30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言